//	--------------------------------------------------------------------
//	Copyright(C) 2006,2007 Zhao Yukun. All rights reserved.
//	This file is a part of the Xeres system.
//	Xeres 2007
//	Contact : xeres.engine@gmail.com
//	$(reservedInfo)
//	$(reservedDeclaration)
//	--------------------------------------------------------------------
///	@file	<CVar.cpp>
///	@path	~/src/object/
///	@date	2007/06/26
///	@desc	IVar base implementation.

#include "config/config.h"

#include "object/CVar.h"

#include "lib/utilities/debug.h"

namespace xeres {

	IMPL_IOBJECT_CLASS_DYNAMIC( CVar );

	// ctor
	CVar::CVar( void )
	{
	}
	// CVar
	CVar::CVar( bool val )
	{
		SetBool( val );
	}
	// CVar
	CVar::CVar( int val )
	{
		SetInt( val );
	}
	// CVar
	CVar::CVar( float val )
	{
		SetFloat( val );
	}
	// CVar
	CVar::CVar( double val )
	{
		SetFloat( float(val) );
	}
	// CVar
	CVar::CVar( const Pair<float>& val )
	{
		SetPair( val );
	}
	// CVar
	CVar::CVar( const Vector<float>& val )
	{
		SetVector( val );
	}
	// CVar
	CVar::CVar( const Quat<float>& val )
	{
		SetQuat( val );
	}
	// CVar
	CVar::CVar( const Matrix<float>& val )
	{
		SetMatrix( val );
	}
	// CVar
	CVar::CVar( const WString& val )
	{
		SetString( val );
	}
	// CVar
	CVar::CVar( RefWeak<IObject> val )
	{
		SetObject( val );
	}
	// dtor
	CVar::~CVar( void )
	{
	}

	// get type name
	const WString& CVar::GetVarTypeName( void ) const
	{
		return m_data.GetVarTypeName();
	}

	// get type id
	const ClassID CVar::GetVarTypeID( void ) const
	{
		return m_data.GetVarTypeID();
	}

	// set value
	bool CVar::SetBool( bool val )
	{
		return m_data.SetBool( val );
	}
	bool CVar::SetInt( int val )
	{
		return m_data.SetInt( val );
	}
	bool CVar::SetFloat( float val )
	{
		return m_data.SetFloat( val );
	}
	bool CVar::SetPair( const Pair<float>& val )
	{
		return m_data.SetPair( val );
	}
	bool CVar::SetVector( const Vector<float>& val )
	{
		return m_data.SetVector( val );
	}
	bool CVar::SetQuat( const Quat<float>& val )
	{
		return m_data.SetQuat( val );
	}
	bool CVar::SetColor( const Color4& val )
	{
		return m_data.SetColor( val );
	}
	bool CVar::SetMatrix( const Matrix<float>& val )
	{
		return m_data.SetMatrix( val );
	}
	bool CVar::SetString( const WString& val )
	{
		return m_data.SetString( val );
	}
	bool CVar::SetObject( RefWeak<IObject> val )
	{
		return m_data.SetObject( val );
	}

	// get value
	bool CVar::GetBool( bool& val ) const
	{
		return m_data.GetBool( val );
	}
	bool CVar::GetInt( int& val ) const
	{
		return m_data.GetInt( val );
	}
	bool CVar::GetFloat( float& val ) const
	{
		return m_data.GetFloat( val );
	}
	bool CVar::GetPair( Pair<float>& val ) const
	{
		return m_data.GetPair( val );
	}
	bool CVar::GetVector( Vector<float>& val ) const
	{
		return m_data.GetVector( val );
	}
	bool CVar::GetQuat( Quat<float>& val ) const
	{
		return m_data.GetQuat( val );
	}
	bool CVar::GetColor( Color4& val ) const
	{
		return m_data.GetColor( val );
	}
	bool CVar::GetMatrix( Matrix<float>& val ) const
	{
		return m_data.GetMatrix( val );
	}
	bool CVar::GetString( WString& val ) const
	{
		return m_data.GetString( val );
	}
	bool CVar::GetObject( Ref<IObject>& val ) const
	{
		return m_data.GetObject( val );
	}

	// copy from
	bool CVar::DuplicateFrom( const Ref<IVar>& val )
	{
		if( val.IsNull() )
			return false;

		if( !val->IsA<CVar>() )
			return false;

		// try to cast an IVar to CVar
		RefWeak<CVar> holder( val );

		return m_data.DuplicateFrom( holder->m_data );
	}

} // namespace xeres
